package com.itheima.d11_proxy.demo;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class Test {
    public static void main(String[] args) {
//        UserServiceImpl u = new UserServiceImpl();
        UserService u = new UserServiceImpl();
//        u.login("aa", "bb");
//        u.deleteUsers();
//        u.selectUsers();

        // 1、把业务对象，直接做成一个代理对象返回，代理对象的类型也是 UserService类型
        //代理对象和业务对象是兄弟关系，他们有着共同的父接口
//        UserService proxy = getProxyInstance(u);
//        UserServiceImpl proxy = getProxyInstance(u); //报错：ClassCastException ---> 不能用真实的业务实现类去接收代理对象，否则会报错

        UserService proxy = getProxyInstance(u);

//        boolean result = proxy.deleteUsers();
//        proxy.updateUsers();
        proxy.selectUsers();
    }

//    public static UserService getProxyInstance(UserService obj) {
//        return (UserService) Proxy.newProxyInstance(
    //AOP 底层实现就是动态代理
    public static <T> T getProxyInstance(T obj) {
        return (T) Proxy.newProxyInstance(
                obj.getClass().getClassLoader(),
                obj.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        //开始时间
                        long t1 = System.currentTimeMillis();

                        //业务对象调用方法
                        Object result = method.invoke(obj, args);

                        //结束时间
                        long t2 = System.currentTimeMillis();

                        System.out.println(method.getName() + "耗时：" + (t2 - t1) / 1000.0 + "s");

                        return result;
                    }
                }
        );
    }
}
